<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html;charset=utf-8" />
<link rel="stylesheet" href="../style/journal.css" type="text/css" />
<style type="text/css"><!--
.googleadsense {
	margin: 2px;
	padding: 0px;
//--></style><script src="http://www.google-analytics.com/urchin.js" type="text/javascript">
</script>
<script type="text/javascript">
_uacct = "UA-65008-1";
urchinTracker();
</script><title>@Examples[0] is Perl6</title>
</head>
<body>
<a href="index.html">Journal</a>(2005) | <a href="../blog/"><b>Blog</b></a>(2006) | <a href="http://www.fayland.org/cgi-bin/random_link.pl">RandomLink</a> | <a href="AboutFayland.html">WhoAmI</a> | <a href="LiveBookmark.html">LiveBookmark</a> | <a href="http://www.fayland.org/">HomePage</a>
<p><&lt;Previous: <a href="050519.html">Synopsis localization</a>&nbsp;&nbsp;>>Next: <a href="Perl6_ES1.html">given @Examples[1] when Perl6</a></p>
<h1>@Examples[0] is Perl6</h1>
<div class='content'>
<p>Category: <a href='Perl6.html'>Perl6</a> &nbsp; Keywords: <b>Perl6</b></p><p>想写点 Perl 6 的东西，却不知道从哪写起，只好写一步算一步了。</p>

<h3>子程序参数传递</h3>
在 Perl 5 中一般来说都用如下代码获得子程序的参数：
<pre>
sub foo {
    my ($a, $b) = @_; # or my $self = shift;
</pre>
在 Perl 6 中
<ul><li>我们可以这么写
<pre>sub foo ($a, $b) {</pre>
<li>也可以这么写
<pre>sub foo {
    ($^a, $^b).say;
}
&foo(11,22); # print 1122</pre>
$^a 得到第一个参数，$^b 得到第二个参数。猜测下如下是什么结果：
<pre>sub foo {
    ($^c, $^b).say;
}
&foo(11,22);</pre>
结果是 2211, 在闭包里所以以 $^ 开头的变量按 Unicode 码排序依次获得参数。（这里的变量可以是 $^cc, $^1y 等）<br />
我们管这种方式为 placeholder arguments, 中文翻译为“占位符参数”。
<li>如果是匿名函数的话还可以这么写
<pre>my $func = -> $a, $b { print $a,$b };
$func.(11,22);</pre>
</ul>

<h3>for 循环语句</h3>
foreach 将不再被使用。 Perl 6 中 for 语句一般这么写：
<pre>for @foo {...}</pre>
这跟 Perl 5 中没有区别。另一种为：
<pre>for @foo -> $item { print $item }</pre>
-> 这种写法是种很强大的写法。
<ol>
<li>一次取多个变量，例如：
<pre>my @foo = (1,2,3);
for @foo -> $item1, $item2 {
    print $item1, $item2, '-';输出为 12-3-
}</pre>
<li>历遍一个 Hash 的写法：（%hash.kv 是将 %hash 变为一个列表，($key1, $value1, $key2, $value2, ...）
<pre>for %hash.kv -> $key, $value { print "$key => $value\n" }</pre>
<li>多个数组写法：（这在 Perl 5 中要用两个 for 才行）
<pre>for zip(@a;@b) -> $a, $b { print "[$a, $b]\n" }
# or for @a ¥ @b ¥ @c -> $a, $b, $c { print "[$a, $b, $c]\n" }
</pre>
¥ 是 zip 的操作符。
</ol>
<p>最后值得注意的是
<pre>for @foo -> $item { print $item }</pre>
这种写法里 $item 是只读的，不是可写的。如果想要在块里改变 $item 的值，必须在后面加上 is rw （rw 是可读写 readwrite 的缩写）
<pre>my @foo = (1,2,3);
for @foo -> $item is rw {
    $item ~= 'a'; # 连接字符串以前用 $a . $b, 现在要用 $a ~ $b 了
    print $item;
}</pre>
而 for @foo { ... } 中 $_ 默认为可读写，也就是说它等同于 for @foo -> $_ is rw { ... }

<h3>Correct me if I'm wrong</h3>
Enjoy!</div>
<p><&lt;Previous: <a href="050519.html">Synopsis localization</a>&nbsp;&nbsp;>>Next: <a href="Perl6_ES1.html">given @Examples[1] when Perl6</a></p>
<p><strong>Options:</strong> <a href='http://del.icio.us/post?title=@Examples%5B0%5D%20is%20Perl6&url=http://www.fayland.org/journal/Perl6_ES0.html'>+Del.icio.us</a></p>
<strong>Related items</strong>
<ul><li><a href='Perl6_ES14.html'>has $.Examples14 handles 'Perl6';</a> < <span class='digit'>2005-06-02 01:38:59</span> ></li><li><a href='050519.html'>Synopsis localization</a> < <span class='digit'>2005-05-19 11:21:25</span> ></li><li><a href='Perl6_ES1.html'>given @Examples[1] when Perl6</a> < <span class='digit'>2005-05-19 22:05:56</span> ></li><li><a href='Perl6_ES2.html'>@Perl6 <== @Examples xx 2</a> < <span class='digit'>2005-05-20 18:53:54</span> ></li><li><a href='Perl6_ES3.html'>my Perl6 @Examples[3]</a> < <span class='digit'>2005-05-21 13:53:16</span> ></li><li><a href='Perl6_ES4.html'>say q:2 '@*Examples.[4] &Perl6()';</a> < <span class='digit'>2005-05-22 12:24:12</span> ></li><li><a href='Perl6_ES5.html'>sub Perl6 (*@Examples[5] is copy)</a> < <span class='digit'>2005-05-22 15:37:26</span> ></li><li><a href='Perl6_ES6.html'>multi sub Examples (6, Perl6) {...}</a> < <span class='digit'>2005-05-23 22:43:33</span> ></li><li><a href='Perl6_ES7.html'>sub infix:<(7)> ($Perl6, @Examples)</a> < <span class='digit'>2005-05-24 02:16:42</span> ></li><li><a href='Perl6_ES8.html'>let @Examples[8] = 'Perl6';</a> < <span class='digit'>2005-05-24 13:05:58</span> ></li><li><a href='Perl6_ES9.html'>Perl6 | Examples & 9 ^ junction</a> < <span class='digit'>2005-05-26 12:35:29</span> ></li><li><a href='Perl6_ES10.html'>%Examples{'IO'} = open('Perl6');</a> < <span class='digit'>2005-05-30 00:24:01</span> ></li><li><a href='Perl6_ES11.html'>class Examples11 is Perl6 { ... }</a> < <span class='digit'>2005-05-30 13:31:31</span> ></li><li><a href='Perl6_ES12.html'>$Perl6 = $class.bless(:Example<12>);</a> < <span class='digit'>2005-05-31 11:38:46</span> ></li><li><a href='Perl6_ES13.html'>role Example13 { # Perl6 }</a> < <span class='digit'>2005-05-31 18:22:03</span> ></li><li><a href='Perl6_ES16.html'>my subtype Examples16 of Perl6 where /^kissu$/</a> < <span class='digit'>2005-06-04 23:59:29</span> ></li><li><a href='Perl6_ES17.html'>my enum Example17 <<:Perl(6) Today>></a> < <span class='digit'>2005-06-05 12:14:08</span> ></li><li><a href='Perl6_ES18.html'>my $queen; rule me {Perl6|Examples18}</a> < <span class='digit'>2005-06-06 12:26:32</span> ></li><li><a href='Perl6_ES19.html'>m:nth(19)/Perl6Examples/</a> < <span class='digit'>2005-06-06 22:02:01</span> ></li><li><a href='Perl6_Rules.html'>用 Perl6::Rules 来写 Formatter</a> < <span class='digit'>2005-09-27 10:02:45</span> ></li></ul>
Created on <span class="digit">2005-05-19 20:26:08</span>, Last modified on <span class="digit">2005-05-25 20:18:22</span><br />
Copyright 2004-2005 All Rights Reserved. Powered by <a href="Eplanet.html">Eplanet</a> && <a href='http://catalyst.perl.org'>Catalyst</a> 5.62.
</body>
</html>